home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / batchut / reply1.zip / REPLY.ASM < prev    next >
Assembly Source File  |  1987-12-15  |  6KB  |  176 lines

  1. PAGE ,132                ;SET FOR WIDE LISTING
  2. ; REPLY.ASM
  3. ;--------------------------------------------------------------------
  4. CODE_SEG SEGMENT
  5.     ASSUME CS:CODE_SEG,DS:CODE_SEG,SS:CODE_SEG,ES:CODE_SEG
  6. ;    ORG 100H               ;THIS COMMAND WAS NOT NEEDED
  7. ;====================================================================
  8. ; BEGINNING OF PROGRAM
  9. ;
  10.     CALL    INPUT        ;GO TO INPUT CHECKING
  11.     CMP    AL,86H        ;WAS THERE AN ERROR(86H)
  12.     JZ    EXIT        ;IF YES, EXIT
  13.     CALL    WAIT        ;GO TO WAITING ROUTINE
  14. EXIT:    MOV    AH,4CH        ;
  15.     INT    21H        ;EXIT WITH CODE IN AL
  16. ;====================================================================
  17. ; DATA AREA ------ ESTABLISH TABLES AND SYMBOLS
  18. ;
  19. TABLE    DB    31H DUP(0),'123456789',7H DUP(0),'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  20. TABLE2    DB    6H DUP(0),'ABCDEFGHIJKLMNOPQRSTUVWXYZ',85H DUP(0)
  21. DUPLIST    DB    80H DUP(0)
  22. RESPONSES DB    24H DUP(0)
  23. NONE    DB    'Missing Reply Parameter.',0DH,0AH,24H
  24. WRONG    DB    'Invalid Reply Parameter.',0DH,0AH,24H
  25. DOUBLE    DB    'Duplicate Reply Parameter.',0DH,0AH,24H
  26. ASKTHIS    DB    'RESPONSE:$'
  27. TIMETICK DB    ' .$'
  28. TIMEOUT DB    ' DEFAULT',0DH,0AH,24H
  29. FEED    DB    0DH,0AH,24H
  30. ;====================================================================
  31. ; CHARACTER INPUT AND CHECKING SUBROUTINE
  32. ;
  33. INPUT:    CLD            ;CLEAR DF
  34.     XOR    CX,CX        ;  "   CX
  35.     MOV    DI,0080H    ;SET DI TO INPUT STRING
  36.     MOV    CL,[DI]        ;PUT COUNT INTO CX
  37.     JCXZ    MISSING        ;IF CX=0 PRINT MISSING & END
  38.     DEC    CX        ;SKIP LEADING SPACE
  39.     MOV    BP,CX        ;PUT CX IN BP FOR LATER
  40.     XOR    AX,AX        ;CLEAR AX
  41.     MOV    SI,0082H    ;SI POINTS TO INPUT STRING
  42.     LEA    DI,RESPONSES+0100H ;DI   "      "  RESPONSES
  43.     LEA    BX,TABLE+0100H    ;BX   "    "  TABLE
  44. TRANSLATE:
  45.     LODSB            ;PUT [SI] INTO AL, INC SI
  46.     XLAT            ;[BX+AL]=>AL
  47.     CMP    AL,00H        ;CHECK IF VALID CHARACTER
  48.     JZ    INVALID        ;PRINT INVALID AND END
  49.     STOSB            ;STORE AL=>[DI], INC DI
  50.     LOOP    TRANSLATE    ;LOOP UNTIL CX=0
  51.     MOV    CX,BP        ;PUT COUNT INTO CX
  52.     XOR    AX,AX        ;CLEAR AX
  53.     LEA    SI,RESPONSES+0100H    ;SI POINTS TO RESPONSES
  54.     LEA    BX,DUPLIST+0100H    ;BX   "    "  DUPLIST
  55. REDUNDANT:
  56.     LODSB            ;PUT [SI]=>AL, INC SI
  57.     MOV    DI,AX        ;COPY CHARACTER INTO DI
  58.     XLAT            ;[BX+AL]=>AL
  59.     CMP    AL,20H        ;DOES IT ALREADY EXIST
  60.     JZ    DUPLICATE    ;YES, PRINT DUPLICATE & END
  61.     MOV    BYTE PTR[BX+DI],20H    ;PUT 20H INTO DUPLIST
  62.     LOOP    REDUNDANT    ;LOOP UNTIL DONE
  63.     XOR    AX,AX        ;CLEAR AX
  64.     JMP    LEAVE        ;GO TO LEAVE AND RETURN
  65. ;====================================================================
  66. ; ERROR MESSAGE OUTPUTS
  67. ;
  68. MISSING:
  69.     MOV    AH,09H        ;
  70.     LEA    DX,[NONE+0100H]    ;
  71.     INT    21H        ;PRINT "MISSING ..."
  72.     MOV    AL,86H        ;SET AL TO ERROR(86H)
  73.     JMP    LEAVE        ;RETURN
  74. ;
  75. INVALID:
  76.     MOV    AH,09H        ;
  77.     LEA    DX,[WRONG+0100H]
  78.     INT    21H        ;PRINT "INVALID ..."
  79.     MOV    AL,86H        ;SET AL TO ERROR(86H)
  80.     JMP    LEAVE        ;RETURN
  81. ;
  82. DUPLICATE:
  83.     MOV    AH,09H        ;
  84.     LEA    DX,[DOUBLE+0100H]
  85.     INT    21H        ;PRINT "DUPLICATE ..."
  86.     MOV    AL,86H        ;SET AL TO ERROR(86H)
  87. ;
  88. LEAVE:    RET            ;RETURN
  89. ;====================================================================
  90. ; START OF TIMING, KEYBOARD RESPONSE, AND CHARACTER CHECKING ROUTINE
  91. ;
  92. WAIT:    XOR    AX,AX        ;CLEAR AX
  93.     MOV    AH,09H        ;
  94.     LEA    DX,ASKTHIS+0100H
  95.     INT    21H        ;PRINT "RESPONSE:"
  96.     MOV    CH,0AH        ;SET TIMER TO 10+1
  97.  
  98. SECONDS: MOV    CL,02H        ;SET TWIDDLE TO 2
  99. HALFSEC: MOV    BX,65500    ;SET TWIDDLE COUNT
  100. TWIDDLE: DEC    BX        ;BX-1=>BX
  101.     CMP    BX,0000        ;IS BX ZERO
  102.     JNZ    TWIDDLE        ;NO, CONTINUE TWIDDLE
  103.     MOV    AH,0BH        ;
  104.     INT    21H        ;CHECK FOR INPUT READY
  105.     CMP    AL,-1        ;-1=READY, 00=NOT
  106.     JZ    PROCESS        ;YES, PROCESS INPUT
  107. RETURN: DEC    CL        ;CL-1=>CL
  108.     CMP    CL,00        ;IS CL ZERO
  109.     JNZ    HALFSEC        ;NO, CONTINUE TIMER
  110.     MOV    AH,09H        ;
  111.     LEA    DX,TIMETICK+0100H
  112.     INT    21H        ;PRINT " ."
  113.     DEC    CH        ;CH-1=>CH
  114.     CMP    CH,00        ;IS CH ZERO
  115.     JZ    DEFAULT        ;YES, PROCESS DEFAULT
  116.     JMP    SECONDS        ;CONTINUE TIMER LOOP
  117. ;====================================================================
  118. ; PROCESS KEYBOARD INPUT - CHECK IF VALID RESPONSE
  119. ;
  120. PROCESS:
  121.     PUSH    BX        ;SAVE BX
  122.     PUSH    CX        ;  "  CX
  123.     PUSH    DI        ;  "  DI
  124.     PUSH    DX        ;  "  DX
  125.     XOR    DX,DX        ;CLEAR DX
  126.     MOV    AH,08H        ;
  127.     INT    21H        ;GET CHARACTER IN AL
  128.     LEA    BX,TABLE+0100H    ;POINT BX TO TABLE
  129.     XLAT            ;[BX+AL]=>AL
  130.     CMP    AL,00        ;IS CHARACTER VALID
  131.     JZ    GOBACK        ;NO, GO BACK TO WAITING
  132.     XOR    CX,CX        ;CLEAR CX
  133.     LEA    BX,RESPONSES+0100H    ;POINT BX TO RESPONSES
  134. SEARCH: INC    CL        ;CL+1=>CL
  135.     MOV    DL,[BX]        ;GET RESPONSES CHARACTER
  136.     CMP    DL,00        ;IS THERE NO CHOOSES
  137.     JZ    GOBACK        ;NO, GO BACK TO WAITING
  138.     CMP    DL,AL        ;DOES INPUT="RESPONSES"
  139.     JZ    FOUND        ;YES, GO TO FOUND
  140.     INC    BX        ;BX+1=>BX
  141.     JMP    SEARCH        ;KEEP SEARCHING
  142. ;====================================================================
  143. ; GO BACK TO WAITING LOOP
  144. ;
  145. GOBACK:    POP    DX        ;RESTORE DX
  146.     POP    DI        ;  "     DI
  147.     POP    CX        ;  "     CX
  148.     POP    BX        ;  "     BX
  149.     JMP    RETURN        ;RETURN TO WAITING
  150. ;====================================================================
  151. ; KEYBOARD INPUT CHARACTER IS A VALID PARAMETER - SET UP RETURN CODE
  152. ;
  153. FOUND:  MOV    AH,02H        ;
  154.     INT    21H        ;ECHO CORRECT CHARACTER
  155.     MOV    AH,09H        ;
  156.     LEA    DX,FEED+0100H    ;
  157.     INT    21H        ;CLEAN UP LINE
  158.     ADD    CL,CH        ;TOTAL THE COUNT
  159.     MOV    AL,CL        ;PUT COUNT IN AL
  160.     POP    DX        ;RESTORE DX
  161.     POP    DI        ;  "     DI
  162.     POP    CX        ;  "     CX
  163.     POP    BX        ;  "     BX
  164.     RET            ;RETURN TO EXIT
  165. ;====================================================================
  166. ; PROCESS DEFAULT OPTION - RETURNS "00" IN AL REGISTER
  167. ;
  168. DEFAULT:MOV    AH,09H        ;
  169.     LEA    DX,TIMEOUT+0100H
  170.     INT    21H        ;PRINT " DEFAULT"
  171.     MOV    AX,0000        ;PUT 0000 IN AX
  172.     RET            ;RETURN
  173. ;====================================================================
  174. CODE_SEG    ENDS
  175.     END
  176.